perm filename FOO.SAI[AL,HE] blob sn#738214 filedate 1984-01-10 generic text, type C, neo UTF8
COMMENT ⊗   VALID 00002 PAGES
C REC  PAGE   DESCRIPTION
C00001 00001
C00002 00002	BEGIN "PUPSUB"
C00011 ENDMK
C⊗;
BEGIN "PUPSUB"

REQUIRE "PUPDEF[HDR,HE]" SOURCE_FILE;

DEFINE	CRLF="('15&'12)",
	! = "COMMENT ";

PROCEDURE SNOOZE(INTEGER TIME(0));
Comment sleeps for 1/60 of a second (until next tick, I guess);
Comment unless argument is nonzero, then it sleeps that many seconds;

BEGIN "SNOOZE"
   QUICK_CODE "SLEEP"
      MOVE '13,TIME;
      CALLI '13,'31
   END "SLEEP";
END "SNOOZE";  Comment what a kludge;

STRING NAME;
INTEGER ARRAY HOSTSOCKET[0:5];
BOOLEAN FOUND;
STRING ERRMESS;
EXTERNAL INTEGER _SKIP_;
INTEGER ARRAY PUP[0:MAXPUPWORDS];
INTEGER ARRAY MTP[0:6];
INTEGER OPCODE,COUNT,BRCHAR,EOF,LEN,PUPCHN,I,J,PTR,NCHAR,HOST,PUPS,NET;
BOOLEAN GOTIT;

COMMENT Call the name server to look up the name NAME.	If found, return
	FOUND=TRUE and return the first host/socket found in HOSTSOCKET[0..5].
	If not found, return FOUND=FALSE and the returned error message in
	ERRMESS. ;

    PUPS ← 0;
    NAME ← "UBEHEBE";
    PUPCHN ← GETCHAN;
    EOF ← 1;
    OPEN(PUPCHN,"PUP",'15,0,0,COUNT,BRCHAR,EOF);
    IF EOF NEQ 0 THEN
	BEGIN
	    FOUND ← FALSE;
	    PRINT("OPEN failed on PUP"&CRLF);
	END
    ELSE BEGIN
    COMMENT Set up an MTAPE to open a connection with the misc. services;
    MTP[0] ← PUPLISTEN; COMMENT Function;
    MTP[2] ← -1; COMMENT Local socket number (generate one);
    MTP[3] ← 0; COMMENT Wait flag;
    MTP[4] ← 8; COMMENT Byte size;
    MTP[5] ← MISCSERV; COMMENT Remote socket number (misc. services);
    MTP[6] ← -1; COMMENT Remote host (broadcast);
    COMMENT Set up MTAPE uuo...;
    OPCODE ← '072000000000 + (PUPCHN LSH 23);
    CODE(OPCODE,MTP[0]);
    IF MTP[1] NEQ 0 THEN
	BEGIN
	    FOUND ← FALSE;
	    ERRMESS ← "Failed to connect to name server";
	END
    ELSE BEGIN
    COMMENT Set up the PUP to send the name request;
    PRINT("Using socket #",CVOS(MTP[2]),CRLF);
    NCHAR ← LENGTH(NAME);
    DPB(NCHAR+PUPOVERHEAD,POINT(16,PUP[0],15)); COMMENT Length in bytes;
    DPB(NAMEREQUEST,POINT(16,PUP[0],31)); COMMENT PUP type;
    FOR I ← 1 STEP 1 UNTIL 4 DO PUP[I] ← 0; COMMENT Let WAITS fill in the rest;
    PTR ← POINT(8,PUP[5],-1);
    FOR I ← 1 STEP 1 UNTIL NCHAR DO IDPB(LOP(NAME),PTR);
    ARRYOUT(PUPCHN,PUP[0],(NCHAR+PUPOVERHEAD+3) DIV 4);
    IF EOF NEQ 0 THEN
	BEGIN
	    FOUND ← FALSE;
	    PRINT("Output to PUP failed"&CRLF);
	END
    ELSE
     DO
      BEGIN
      COMMENT Get reply from misc. server;
      MTP[0] ← SKIPREADY;
      CODE(OPCODE,MTP[0]);
      IF _SKIP_ = 0 THEN
	  BEGIN
	      SNOOZE(1);
	      CODE(OPCODE,MTP[0]);
	      IF _SKIP_ = 0 THEN
		  BEGIN
		      SNOOZE(1);
		      CODE(OPCODE,MTP[0]);
		      IF _SKIP_ = 0 THEN
			  GOTIT ← FALSE
		      ELSE
			  GOTIT ← TRUE
		  END
	      ELSE
		  GOTIT ← TRUE
	  END
      ELSE
	  GOTIT ← TRUE;
      IF NOT GOTIT THEN
	  BEGIN
	      FOUND ← FALSE;
	      PRINT("No reply from name server"&CRLF);
	  END
      ELSE
	BEGIN
	COMMENT Receive the PUP;
	ARRYIN(PUPCHN,PUP[0],MAXPUPWORDS);
	HOST ← LDB(POINT(8,PUP[3],31));
	PRINT("Received a reply from host = ",HOST,CRLF);
	J ← (LDB(POINT(16,PUP[2],31)) LSH 16) LOR LDB(POINT(16,PUP[3],15));
	PRINT("Using socket #",CVOS(J),CRLF);
	COMMENT Extract PUP type, check if successful;
	IF LDB(POINT(8,PUP[0],31)) = NAMEREPLY THEN
	    BEGIN
		FOUND ← TRUE;
		PTR ← POINT(8,PUP[5],-1);
		FOR I ← 0 STEP 1 UNTIL 5 DO
		    PRINT("   ",(HOSTSOCKET[I] ← ILDB(PTR)));
		PRINT(CRLF);
		IF PUPS = 0 THEN
		BEGIN
		PUPS ← 1;
		RELEASE(PUPCHN);
		OPEN(PUPCHN,"PUP",'15,0,0,COUNT,BRCHAR,EOF);
		IF EOF NEQ 0 THEN
		    BEGIN
			FOUND ← FALSE;
			PRINT("OPEN failed on PUP"&CRLF);
		    END;
		! Set up an MTAPE to open a connection with whoever replied;
		MTP[0] ← 0; COMMENT Connect Function;
		MTP[2] ← J; COMMENT Keep old local socket number;
		MTP[3] ← 0; COMMENT Wait flag;
		MTP[4] ← 8; COMMENT Byte size;
		MTP[5] ← MISCSERV; COMMENT Remote socket number (misc. services);
		MTP[6] ← HOST; COMMENT Remote host who replied;
		COMMENT Set up MTAPE uuo...;
		OPCODE ← '072000000000 + (PUPCHN LSH 23);
		CODE(OPCODE,MTP[0]);
		IF MTP[1] NEQ 0 THEN
		    BEGIN
			FOUND ← FALSE;
			ERRMESS ← "Failed to connect to individual name server";
		    END
		ELSE PRINT("Opened connection ok",CRLF);
		NAME ← "UBEHEBE";
		NCHAR ← LENGTH(NAME);
		DPB(NCHAR+PUPOVERHEAD,POINT(16,PUP[0],15)); COMMENT Length in bytes;
		DPB(NAMEREQUEST,POINT(16,PUP[0],31)); COMMENT PUP type;
		FOR I ← 1 STEP 1 UNTIL 4 DO PUP[I] ← 0; COMMENT Let WAITS fill in the rest;
		PTR ← POINT(8,PUP[5],-1);
		FOR I ← 1 STEP 1 UNTIL NCHAR DO IDPB(LOP(NAME),PTR);
		ARRYOUT(PUPCHN,PUP[0],(NCHAR+PUPOVERHEAD+3) DIV 4);
		IF EOF NEQ 0 THEN
		    BEGIN
			FOUND ← FALSE;
			PRINT("Output to PUP failed"&CRLF);
		    END;
		END
	    END
	ELSE
	    BEGIN
		FOUND ← FALSE;
		LEN ← LDB(POINT(16,PUP[0],15))-PUPOVERHEAD;
		PTR ← POINT(8,PUP[5],-1);
		ERRMESS ← NULL;
		FOR I ← 1 STEP 1 UNTIL LEN DO ERRMESS ← ERRMESS & ILDB(PTR);
		PRINT(ERRMESS,CRLF);
	    END;
	END
      END UNTIL NOT GOTIT
    END END;
    RELEASE(PUPCHN);

END "PUPSUB"